package org.xx.armory.service;

import org.xx.armory.bindings.BoundParamCollection;
import org.xx.armory.rpc.Decorator;
import org.xx.armory.rpc.RpcRequest;
import org.xx.armory.rpc.RpcResponse;

import java.lang.reflect.Method;

/**
 * 配合修饰器使用的Bean方法调用器。
 *
 * @author Haart
 * @see Decorator
 */
public interface Invocation {
    /**
     * 获取关联的RPC请求对象。
     *
     * @return 关联的RPC请求对象。
     */
    RpcRequest getRequest();

    /**
     * 获取关联的RPC响应对象。
     *
     * @return 关联的RPC响应对象。
     */
    RpcResponse getResponse();

    /**
     * 获取待执行的对象。
     *
     * @return 待执行的对象。
     */
    Object getObject();

    /**
     * 获取待执行的方法。
     *
     * @return 待执行的方法。
     */
    Method getMethod();

    /**
     * 获取执行此方法需要的权限数组。
     *
     * @return 执行此方法需要的权限数组，如果不需要权限则返回空数组。
     */
    int[] getPermission();

    /**
     * 执行指定的方法。
     *
     * @param params
     *         执行方法时传入的参数集合。
     * @param serviceContext
     *         服务上下文。
     * @return 执行结果。
     * @throws Throwable
     *         如果执行方法时出现错误。
     */
    Object execute(
            BoundParamCollection params,
            ServiceContext serviceContext
    )
            throws Throwable;
}
